package com.lq.filestudy.controller;


import com.hankcs.hanlp.HanLP;
import org.apache.commons.collections4.CollectionUtils;

import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StrController {


    public static void main(String[] args) {
        String text = "主题：<a href=\"https://scitechdaily.com/tag/battery-technology/\" target=\"\">电池技术</a><a href=\"https://scitechdaily.com/tag/energy/\" target=\"\">能源</a><a href=\"https://scitechdaily.com/tag/nanyang-technological-university/\" target=\"\">南洋理工大学</a>By 南洋理工大学 28年2023月&lt;&gt;日<img src=\"https://scitechdaily.com/images/Flexible-Battery-That-Is-As-Thin-as-a-Human-Cornea-777x583.jpg?ezimgfmt=rs:777x583/rscb2/ng:webp/ngcb2\" alt=\"像人体角膜一样薄的柔性电池\" />这种透明薄膜可以改变...PauseUnmuteLoaded: 4.38%Remaining Time -2:17FullscreenPlay Video南洋理工大学电机与电子工程学院（EEE）的Lee Seok Woo副教授举起像人类角膜一样薄的柔性电池。图片来源：新加坡南洋理工大学新加坡<a href=\"https://scitechdaily.com/tag/nanyang-technological-university/\" target=\"\">南洋理工大学</a>（NTU Singapore）的研究人员创造了一种像人类角膜一样薄的柔性电池。这种创新的储能设备在浸没在盐水溶液中时会自行充电，并有可能在未来为智能隐形眼镜提供燃料。智能隐形眼镜是一种高科技隐形眼镜，能够显示我们角膜上的可见信息，并可用于访问增强现实。目前的用途包括帮助矫正视力、监测佩戴者的健康状况，以及标记和治疗患有糖尿病和青光眼等慢性疾病的人的疾病。未来，可以开发智能隐形眼镜来记录佩戴者所看到和听到的一切并将其传输到基于云的数据存储中。然而，为了实现这种未来潜力，需要开发一种安全且合适的电池来为它们供电。现有的可充电电池依赖于含有金属的电线或感应线圈，不适合在人眼中使用，因为它们不舒服并给用户带来风险。NTU开发的电池由生物相容性材料制成，不含电线或有毒重金属，例如锂离子电池或无线充电系统中的金属。它有一个基于葡萄糖的涂层，可以与周围盐水溶液中的钠离子和氯离子发生反应，而电池所含的水则用作发电的“电线”或“电路”。电池也可以由人类的眼泪供电，因为它们含有较低浓度的钠离子和钾离子。研究人员用模拟撕裂溶液测试了当前的电池，结果表明，电池的寿命每使用12小时，其寿命就会延长一个小时。电池也可以通过外部电源进行常规充电。<img src=\"https://scitechdaily.com/images/Lee-Seok-Woo-and-Li-Zongkang-777x583.jpg?ezimgfmt=rs:777x583/rscb2/ng:webp/ngcb2\" alt=\"Lee Seok Woo 和 Li Zongkang\" />李副教授和该研究的共同第一作者、南洋理工大学EEE的博士生李宗康小姐介绍了电池。图片来源：新加坡南洋理工大学领导这项研究的南洋理工大学电气与电子工程学院（EEE）副教授Lee Seok Woo说：“这项研究始于一个简单的问题：隐形眼镜电池可以用我们的眼泪充电吗？也有类似的自充电电池的例子，例如由人体汗液驱动的可穿戴技术电池。“然而，以前的镜头电池技术并不完美，因为电池电极的一侧是充电的，而另一侧则没有。我们的方法可以通过酶促反应和自还原反应的独特组合为电池的两个电极充电。除了充电机制外，它仅依靠葡萄糖和水来发电，与传统电池相比，这两种电池对人类都是安全的，并且在处理时对环境的危害较小。共同第一作者、南洋理工大学EEE研究员Yun Jeonghun博士说：“智能隐形眼镜最常见的电池充电系统需要在镜片中使用金属电极，如果暴露在肉眼下是有害的。同时，另一种为镜头供电的方式，即感应充电，需要镜头中有一个线圈来传输电力，就像智能手机的无线充电板一样。我们的泪液电池消除了这两种方法带来的两个潜在问题，同时也为智能隐形眼镜的进一步创新腾出了空间。南洋理工大学机械与航空航天工程学院副教授Murukeshan Vadakke Matham强调了研究团队所做工作的重要性，他专门研究生物医学和纳米光学，没有参与这项研究，他说：“由于这种电池是基于葡萄糖氧化酶，葡萄糖氧化酶天然存在于人体中，由氯离子和钠离子提供动力。 比如我们眼泪中的那些，它们应该是相容的，适合人类使用。除此之外，智能隐形眼镜行业一直在寻找一种不含重金属的薄型生物相容性电池，这项发明可以帮助它们进一步发展，以满足该行业一些未满足的需求。该研究团队已通过南洋理工大学的创新和企业公司NTUitive申请了专利。他们还在努力将他们的发明商业化。研究结果最近发表在<em>《纳米能源</em>》杂志上。给我哭泣该团队使用模拟人眼展示了他们的发明（见视频）。电池薄约0.5毫米，通过与基底泪液反应产生电能 - 持续泪液在我们的眼球上形成薄膜 - 使嵌入镜片中的设备发挥作用。当其葡萄糖氧化酶涂层与泪液中的钠离子和氯离子发生反应时，柔性和扁平电池通过称为还原的过程放电，从而在隐形眼镜内产生功率和电流。该团队证明，电池可以产生45微安的电流和201微瓦的最大功率，这足以为智能隐形眼镜供电。实验室测试表明，电池最多可以充电和放电 200 次。典型的锂离子电池的使用寿命为 300 至 500 次充电周期。该团队建议将电池放置在含有大量葡萄糖、钠和钾离子的合适溶液中至少八小时，以便在用户睡眠时充电（见图 1）。共同第一作者、南洋理工大学EEE博士生李宗康小姐说：“虽然无线电力传输和超级电容器提供高功率，但由于镜头空间有限，它们的集成带来了重大挑战。通过将电池和生物燃料电池组合成一个组件，电池可以自行充电，而无需为有线或无线组件提供额外的空间。此外，放置在隐形眼镜外侧的电极确保了眼睛的视力不会被遮挡。南洋理工大学团队将进行进一步的研究，以提高他们的电池可以放电的电流量。他们还将与几家隐形眼镜公司合作实施他们的技术。参考资料：Jeonghun Yun、Zongkang Li、Xinwen Miao、Xiaoya Li、Jae Yoon Lee、Wenting Zhao 和 Seok Woo Lee，13 年 2023 月 10 日，<em>Nano Energy</em>。<a href=\"https://doi.org/10.1016/j.nanoen.2023.108344\" target=\"\">DOI： 1016.2023/j.nanoen.108344.&lt;&gt;</a>";
           String summary = getSummary(text);
        System.out.println(summary);
    }

    public static String getSummary(String text) {
        // 分割句子
        List<String> sentenceList = splitSentence(text);
        int sentenceCount = sentenceList.size();

        // 计算每个句子的分数
        double[] scores = new double[sentenceCount];
        Arrays.fill(scores, 1.0);
        for (int i = 0; i < 10; i++) { // 自定义 TextRank 迭代次数
            double[] tempScores = Arrays.copyOf(scores, scores.length);
            for (int j = 0; j < sentenceCount; j++) {
                double score = 0.0;
                for (int k = 0; k < sentenceCount; k++) {
                    if (k != j) {
                        score += similarity(sentenceList.get(j), sentenceList.get(k));
                    }
                }
                tempScores[j] = 0.15 + 0.85 * score;
            }
            scores = tempScores;
        }

        // 排序提取文本摘要
        int summarySize = Math.max(sentenceCount / 10, 1);
        PriorityQueue<Sentence> queue = new PriorityQueue<>(summarySize);
        for (int i = 0; i < sentenceCount; i++) {
            queue.offer(new Sentence(scores[i], i));
        }
        List<Integer> indexList = new ArrayList<>();
        for (int i = 0; i < summarySize; i++) {
            indexList.add(queue.poll().index);
        }
        Collections.sort(indexList);
        StringBuilder summary = new StringBuilder();
        for (Integer index : indexList) {
            summary.append(sentenceList.get(index)).append("。");
        }
        return summary.toString();
    }

    /**
     * 分割句子
     */
    private static List<String> splitSentence(String text) {
        List<String> sentenceList = new ArrayList<>();
        String[] sentences = text.split("[\\n。？！；]");
        for (String sentence : sentences) {
            sentence = sentence.trim();
            if (sentence.length() > 0) {
                sentenceList.add(sentence);
            }
        }
        return sentenceList;
    }

    /**
     * 计算句子相似度
     */
    private static double similarity(String sentence1, String sentence2) {
        // 使用余弦相似度计算
        List<String> words1 = HanLP.segment(sentence1).stream().map(term -> term.word).collect(Collectors.toList());
        List<String> words2 = HanLP.segment(sentence2).stream().map(term -> term.word).collect(Collectors.toList());
        int intersection = CollectionUtils.intersection(words1, words2).size();
        return intersection/Math.sqrt(words1.size() * words2.size());
    }

    /**
     * 句子类，用于保存句子分数和句子在文章中的索引
     */
    private static class Sentence implements Comparable<Sentence> {
        double score;
        int index;

        public Sentence(double score, int index) {
            this.score = score;
            this.index = index;
        }

        @Override
        public int compareTo(Sentence o) {
            return Double.compare(o.score, score);
        }
    }



}